#include <bits/stdc++.h>
#define int long long 
using namespace std;
const int N = 25;
int n;
string s1, t;
int k;
int op[N], x[N], y[N];

bool check(int arr[], vector<int> v){
	string t1 = s1;
	for (int i=1;i<=v.size();i++) {
		int pos = arr[i];
		int a = op[pos], b = x[pos], c = y[pos];
		if (a == 1) {
			t1[b] = ((t1[b]-'0')+c)%10 + '0';
		} else {
			// 交换a
			swap(t1[b], t1[c]);
		}
	}
//	cout << t1 << ' ' << t << '\n';
	return t1==t; 
}

// v 表示需要进行全排列的序列
// 那么深度就是 v.size+1
// arr 要存储的就是 v[i]
bool dfs(int dep, vector<int> v, bool vis[], int arr[]){
//	cout << dep << ' ' << v.size() << '\n';
	if (dep == v.size()+1) {
		// 已经处理完了
		if (check(arr, v)) {
			return true;
		} else {
			return false;
		}
	}
	
	for (int i=0;i<v.size();i++) {
		// 遍历所有的 pos 
		if (vis[i]) {
			// 已经使用过了
			continue;
		}
		int pos = v[i];
		arr[dep] = pos; // 使用
		vis[i] = true;
		if(dfs(dep+1, v, vis, arr)){
			return true;
		}
		// 恢复现场
		vis[i] = false;
	}
	return false;
}

void solve(){
	cin >> n;
	cin >> s1;
	cin >> t;
	cin >> k;
	for (int i=1;i<=k;i++) {
		cin >> op[i] >> x[i] >> y[i];
	}
	
	
	// 使用位运算, 来代表这个操作选还是不选
	for (int i=1;i<(1<<k);i++) {
		vector<int> v;
		bool vis[N];
		int arr[N];

		for (int k=1;k<=N;k++) {
			vis[k] = false;
			arr[k] = 0;
		} 
		for (int j=0;j<k;j++) {
			if ((i>>j)&1) {
				// 这个位置选
				v.push_back(j+1);
			}
		}
		if (dfs(1, v, vis, arr)) {
			cout << "Yes" << '\n';
			return;
		}
	}
	cout << "No" << '\n';		
}

signed main(){
	ios::sync_with_stdio(0), cin.tie(0), cout.tie(0);
	solve();
	return 0;
}
